package main

import (
	"fmt"
	"time"
)

func TryDo(cc chan struct{}) bool {
	select {
	case cc <- struct{}{}: //如果通道中还有空间（这意味着它没有达到容量），则标记发送成功，函数继续执行。
		return true
	default: //如果 通道已经满了，这部分就会启动。它不会阻塞并等待空间释放，而是直接进入默认情况。
		return false
	}
}

func main() {
	//var cc chan struct{}
	//var cc chan int //not OK
	//cc := make(chan int) //OK
	cc := make(chan int, 0) //OK 所以channel必须使用make，否则可能出问题
	//cc := make(chan int, 1) //OK

	//如果使用channel但又不想等待，可以考虑select
	go func() {
		for i := 0; i < 10; i++ {

			select {
			case cc <- 1:
				fmt.Println("xxx")
			default:
				fmt.Println("default")
			}
			<-time.After(time.Second)
		}
	}()

	go func() {
		for {
			<-cc
			fmt.Println("got from cc")
		}
	}()
	for {
		<-time.After(time.Millisecond * 500)
		fmt.Println(cap(cc), len(cc))
	}
	<-time.After(time.Second * 10)
}
